#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     import_module_class
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/12/15
-------------------------------------------------
   修改描述-2021/12/15:         
-------------------------------------------------
"""
import os
import importlib
import inspect

from importlib import import_module

def import_class(path):
    package, klass = path.rsplit('.', 1)
    module = import_module(package)
    return getattr(module, klass)

def import_instance(path):
    package, class_name = path.rsplit('.', 1)
    module = import_module(package)
    klass = getattr(module, class_name)
    return klass()

def auto_and_createVar(pro_path,createVar,filter_class_name='Servicer'):
    '''
    这个方法导入的是__init__.py下的所有的模块还有特点类型的类的过滤！
    :param pro_path:
    :param createVar:
    :return:
    '''
    for root, dirs, files in os.walk(pro_path):
        for file in files:
            name, ext = os.path.splitext(file)
            # 进行模块查询
            if ext == '.py' and name != '__init__' and pro_path == root:
                module = importlib.import_module(name)
                # ==========必须使用不一样的变量来存
                # if name =='ser1':
                #     Greeter = getattr(module, 'AGreeter')  # 获取module
                # else:
                #     BatchGreeter = getattr(module, 'BatchGreeter2')  # 获取module
                # 进行模块下过滤非特点的类的导入
                #   service_class = [mod[1] for mod in inspect.getmembers(module) if inspect.isclass(mod[1])]
                #   print("打印模块内所有输出-类：", service_class)
                # issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
                for _servicer_parent_class_name, _servicer_parent_class in inspect.getmembers(module, inspect.isclass):
                    # 获取当前服务模块的
                    # _servicer_parent_class---指向的是顶层的父类
                    # print("_servicer._servicer_name",_servicer_name,_servicer_parent_class)
                    for classitem in _servicer_parent_class.__bases__:
                        # classitem执行的内部的继续的子类
                        # 查询需要是基于Servicer类的特点的类
                        if classitem.__name__.endswith(filter_class_name):
                            pass
                            # inspect模块提供了一些函数来了解现场对象，包括 模块、类、实例、函数和方法。
                            # 动态变量的创建---必须是一个动态变量，因为getattr(module, _servicer_name)必须需要一个变量来存在，才可以正确的导入
                            # 方式1：createVar[_servicer_name] = getattr(module, _servicer_name)
                            # 方式2：
                            createVar[_servicer_parent_class_name] = _servicer_parent_class
                        else:
                            # 必须-删除其他非endswith('Servicer')的模块，引入再加载服务的时候必须是指定类型的服务类的才可以加载
                            del classitem
                    # 删除因为使用inspect.getmembers导入的其他的模块（可选，也可以不删，但是建议删了！）
                    del _servicer_parent_class